Add \ion, \positiveion, \negativeion commands for chemistry notation#45
Add \ion, \positiveion, \negativeion commands for chemistry notation#45drdrew42 wants to merge 5 commits into
Conversation
Ion charge notation — `\ion[+]{2}` rendering the "2+" of a 2+ cation — is a superscript-only command: an editable charge block followed by a fixed sign. `\positiveion` and `\negativeion` are sign-bound shorthands.
These commands existed in a downstream MathQuill fork used for WeBWorK chemistry problems (the chemQuill answer-entry toolbars); this restores them on @openwebwork/mathquill so that work can drop the private fork.
Ion extends SupSub, mirroring the existing subscript/superscript classes. latex() serializes to \ion[sign]{charge}; \positiveion / \negativeion canonicalize to the same. Round-trip tests added to test/latex.test.ts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
I think you need to add some explanation of how to use this, and how this would work with PG. This isn't something that can be directly typed into a MathQuill input. |
|
Originally, LibreTexts wanted to implement a toolbar for chemistry problems (see repo for foundations), and looped in Davide to help improve contextReaction.pl (which includes implementation of ions, compatible with this extension of MathQuill)... and some of that work has now been folded into PG official. They're finally pulled up to date with PG, but that migration has hit a snag -- as it seems I never submitted the ions implementation to our fork of MathQuill. Ions are not "real" LaTeX, and it is unexpected that any student would type them in (though they could...), rather it is expected that mathquill toolbar entries be added for them (LibreTexts has macros for this already): I have a similar request to add a |
|
Now that the toolbar is part of this repository, you should merge in the main branch to get it and demonstrate the usage, or how to implement a toolbar button. Currently with this pull request I am not able to get anything to work with the toolbar. |
\sci{exp} renders a fixed ×10 followed by an editable exponent block;
the scientific-notation answer toolbar (chemQuillMath.pl) drives it.
Mirrors the existing \ion classes (SupSub subclass). latex() serializes
to \sci{exp}; text() serializes to *10^exp — explicit multiplication and
power, the operations scientific notation denotes — so answers parse
through the MathObjects scientific-notation context's mantissa/power
checks rather than bypassing them via E-notation. Restores a command the
old 0.10 private fork carried. Round-trip tests added to test/latex.test.ts.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Sorry, I had the triple-layer escaping going there, only need the double for input-test.js I had no problems adding the following to input-test.js mathField.options.addToolbarButtons([
{ id: 'sci', latex: '\\sci', tooltip: 'scientific notation', icon: '\\times10^\\text{ }' },
{ id: 'positiveion', latex: '\\positiveion', tooltip: 'positive ion', icon: '\\text{ }^{\\text{ }+}' },
{ id: 'negativeion', latex: '\\negativeion', tooltip: 'negative ion', icon: '\\text{ }^{\\text{ }-}' }
]); Well, I say no problems -- there's some issue with the appearance of the icons, I'm working on that. With the ions, it's a matter of combining whitespace with another glyph...
|
|
No, I think those buttons shouldn't be added to the I figured out how to use this. What was confusing me was that since these define from SupSubs the supSubsRequireOperand applies. So something needs to be typed first to use these. One thing that is going to be needed for these is mathspeak. |
Addresses review feedback on the chemistry/scientific-notation commands:
- mathspeak() on Ion and ScientificNotation so screen readers announce
them meaningfully ("charge 2 positive", "times ten to the 8th power")
instead of the inherited SupSub "Superscript, ..., Baseline".
- public/input-test.js demonstrates the commands as toolbar buttons
(\sci, \positiveion, \negativeion) via options.addToolbarButtons.
- toolbar.scss: let an icon's super/subscript carry a real glyph (the ion
+/- charge) rather than clipping it to placeholder-box size, so the
charge is visible on the button.
- aria.test.ts: mathspeak assertions for the new commands.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mocha.run() was called from a mid-body inline script, before the mathquill.test.js bundle (included at the end of the body) registered any suites — so opening the page ran 0 tests. Move the run into a window 'load' listener so the suites are registered first. Setup and teardown stay inline (they only define globals). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Okay, I've added mathspeak for \sci and the ions. But in writing the corresponding tests, I found that the unit-test.html wasn't running the suite -- so I added that fix as a follow-up commit. |
drgrice1
left a comment
There was a problem hiding this comment.
The general code for the ion charges and scientific notation is looking okay now. I think it is a bit odd to derive scientific notation from a supsub, but that is okay for now.
There is one thing that bothers me with this pull request in general. This is adding code for these chemistry elements that are not in any official PG macro or internal PG code. This is instead for unofficial code and macros in https://github.com/WeBWorK-for-Chemistry/WeBWorKChemistry. It seems that the things in that repository should be submitted for review to PG, and made official before changes needed for that should be added here.
| { id: 'positiveion', latex: '\\positiveion', tooltip: 'positive ion', icon: '\\text{ }^{\\text{ }+}' }, | ||
| { id: 'negativeion', latex: '\\negativeion', tooltip: 'negative ion', icon: '\\text{ }^{\\text{ }-}' } | ||
| ]); | ||
|
|
There was a problem hiding this comment.
I said not to add these. In general, input-test.html is set up to have the default options that are used by PG. The exception is the addition of the subscript button to demonstrate the usage of the the addToolBarButtons method, and don't entirely like that I did that. I was planning to eventually add a user interface element to the page to allow dynamically adding and removing buttons from the toolbar. I don't like these buttons that are non-standard being added to this.
| }; | ||
| // Run after window load so the test bundle (mathquill.test.js, included at | ||
| // the end of the body) has registered its suites before mocha.run(). | ||
| window.addEventListener('load', () => { |
There was a problem hiding this comment.
This seems to be an issue that is specific to Google Chrome (and maybe some others), but it does not occur in Firefox, and only happens when the dev server hot reloads. On initial page load the unit tests work as they should, but when the dev server hot reloads they don't. You need to refresh the page to get the unit tests to run again. I have noticed this before, but didn't care enough to look into it and fix it.
Don't use a load event for this though. Instead just reorganize the script tags. End the first script tag on line 31 above. Then move the lines
<!-- include the library with the tests inlined -->
<script id="mathquill" src="mathquill.test.js"></script>
after that. Then start a new script tag after that.
What
Adds three LaTeX commands for chemistry ion-charge notation:
\ion[sign]{charge}— a superscript-only command: an editable charge block followed by a fixed+/-sign, rendering e.g. the "2+" of a 2+ cation.\positiveion/\negativeion— sign-bound shorthands that canonicalize to\ion[+]{…}/\ion[-]{…}.Why
These commands existed in a downstream MathQuill fork used for WeBWorK chemistry problems — the chemistry answer-entry toolbars drive
\positiveion/\negativeionfor entering ion charges. They were lost when that work moved onto@openwebwork/mathquill, silently breaking those toolbar buttons. Restoring them upstream lets the downstream work drop the private fork.How
IonextendsSupSub, mirroring the existing subscript/superscript classes incommands.ts—supsub = 'sup', anhtmlTemplatecarrying the editable charge block plus a.mq-ion-classed sign span, and aparser()built onlatexMathParser.optBlock/.blockexactly likeNthRoot.latex()serializes to\ion[sign]{charge}; an absent optional sign defaults to+, and an empty charge block to1..mq-ionis a styling hook on the sign span — no CSS rule is added; it renders correctly with the existingmq-supstyles.Testing
npm run build,npm run lint:check, andnpm run format:checkall pass.test/latex.test.ts(theion chargestest), following the existingassertParsesLatexpattern.🤖 Generated with Claude Code